import {hasOwn} from '@/core/utils'

let cache = {}
const re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g

function lower (string) {
  return string.toLowerCase()
}

export function slugify (str) {
  if (typeof str !== 'string') {
    return ''
  }

  let slug = str
    .trim()
    .replace(/[A-Z]+/g, lower)
    .replace(/<[^>\d]+>/g, '')
    .replace(re, '')
    .replace(/\s/g, '-')
    .replace(/-+/g, '-')
    .replace(/^(\d)/, '_$1')
  let count = cache[slug]

  count = hasOwn.call(cache, slug) ? count + 1 : 0
  cache[slug] = count

  if (count) {
    slug = slug + '-' + count
  }

  return slug
}

slugify.clear = function () {
  cache = {}
}
